package main

import "fmt"

// // 类名，变量名，方法名首字母大写表示公有对外开放访问，小写表示私有，包内访问
// type Hero struct {
// 	name  string
// 	ad    int
// 	level int // 首字母小写，仅可以包内访问
// }

// func NewHeroObj(name string, ad int, level int) (*Hero, error) {
// 	hero := new(Hero)
// 	if hero == nil {
// 		return nil, errors.New("new hero obj failed!")
// 	}
// 	hero.name = name
// 	hero.ad = ad
// 	hero.level = level
// 	return hero, nil
// }

// type Handler interface {
// 	Get()
// }

// func (this *Hero) Get() {
// 	log.Println("Hero实现接口方法 Get()")
// }

// // 成员函数传Hero表示传传值传参
// func (this *Hero) Name() {
// 	fmt.Println("name = ", this.name)
// }
// func (this *Hero) Ad() {
// 	fmt.Println("Ad = ", this.ad)
// }
// func (this *Hero) Level() {
// 	fmt.Println("level = ", this.level)
// }

// type Student struct {
// }

// func (this *Student) Get() {
// 	log.Println("Student实现接口方法 Get()")
// }

// func Hello(h Handler) {
// 	if h != nil {
// 		h.Get()
// 	}
// }

// type Common interface {
// 	Attack()
// }
// type People struct {
// 	name  string
// 	hp    int
// 	level int
// }

// type Wz struct {
// 	P People
// }

// func (this *Wz) Attack() {
// 	log.Println("法师攻击20点")
// }

// type Wa struct {
// 	P People
// }

// func (this *Wa) Attack() {
// 	log.Println("战士攻击10点")
// }

// type FuncSet struct {
// }

// // 需要接受实现了Attact方法的任意职业角色，调用Attact方法
// func (this *FuncSet) Exe(com Common) {
// 	com.Attack()
// }

// func main() {

// 	// 	hero, err_msg := NewHeroObj("张三", 100, 1)

// 	// 	if err_msg != nil {
// 	// 		log.Println(err_msg)
// 	// 	}
// 	// 	var s Student
// 	// 	Hello(hero)
// 	// 	Hello(&s)
// 	//
// 	var h FuncSet
// 	var w Wa
// 	h.Exe(&w)
// }

// 利用interface实现多态现象
// intreface 本质是指针
// type Animal interface {
// 	Sleep()
// 	Color()
// 	Kind()
// }

// type Cat struct {
// 	color string
// }

// func (this *Cat) Sleep() {
// 	fmt.Println("cat sleep ...")
// }
// func (this *Cat) Color() {
// 	fmt.Println("cat color ", this.color)
// }
// func (this *Cat) Kind() {
// 	fmt.Println("cat")
// }

// type Dog struct {
// 	color string
// }

// func (this *Dog) Sleep() {
// 	fmt.Println("dog sleep ...")
// }
// func (this *Dog) Color() {
// 	fmt.Println("dog color ", this.color)
// }
// func (this *Dog) Kind() {
// 	fmt.Println("dog")
// }

// func ShowAnimal(animal Animal) {
// 	animal.Sleep()
// 	animal.Color()
// 	animal.Kind()
// }

// func main() {
// 	cat := Cat{"black"}
// 	dog := Dog{"red"}

// 	ShowAnimal(&cat)
// 	ShowAnimal(&dog)
// }

// interface{} 是万能数据类型
func MyFunc(t interface{}) {
	fmt.Println("T is called ...")
	fmt.Println(t)

	// 类型断言机制
	value, ok := t.(string)
	if !ok {
		fmt.Println("T is not string")
	} else {
		fmt.Println("value: ", value)
	}
}

type Book struct {
	auth string
}

func main() {
	var book Book
	MyFunc(book)
	MyFunc(1234)
	MyFunc("aaa")
}
